Fdd48.narod.ru

 

Комментарии:

Помимо ; комментарий может начинаться с //

Для многострочных комментариев используйте /* в начале и */ в конце

Операции присваивания:

Допустимы пробелы между операндами

Старый синтаксис:

S s=1+2

Новый:

Set s = 1 + 2

If:

Более не следует беспокоиться о “точечных” блоках и значении $Test:

; раньше

If a=4 Do
. Set r=6
Else  If (a=5) Do
. Set r=9
Else  Do
. Set r=7

// Теперь

If (a = 4) {

  Set r = 6
  }
ElseIf (a = 5) {
  Set r = 9
  }
Else {
  Set r = 7
  }

; Раньше

If ('ok) QUIT err

// Теперь

If ('ok) {

  QUIT err

}

Постусловия:

; Раньше

Set:a=2 x=3

// Теперь

If (a = 2) {

  Set x = 3

}

Циклы:

; Раньше

for i=1:1:10 Do

. Write "this is line"

. Write i,!

// Теперь

For i=1:1:10 {

  Write "this is line"

  Write i,!

}

$Order в цикле:

; Раньше

Set i="" For  Set i=$O(^yan(i)) Quit:i=""  Do

   . Write ^yan(i),!

// Теперь

Set i = $O(^yan(""))

   While (i '= "") {

     Write ^yan(i),!
    
Set i = $O(^yan(i))
   }

Теперь инициализация параметра цикла и его изменение происходят в разных местах – как это делается в других языках.

Использование объекта ResultSet:

; Раньше

Do query.Execute()
For  Quit:'query.Next() Do
.
Write query.Get("Name"),!

// Теперь

Do query.Execute()
While (query.Next()) {
  Write query.Get("Name"),!
}

Обратите внимание:

While (expr) {
  New x
  //
  ...
  }

Блок { } в этом случае не создает новый кадр стека. Команда New в цикле каждый раз помещает значение в стек, пока область стека не будет полностью заполнена и Вы получите ошибку <FRAMESTACK>!

Выход по QUIT из блока { } – также как { } не открывают новый уровень стека, по QUIT происходит выход, как если бы не было блока { }:

function()

   If (error) {
     Quit "error" 
// Выход из "function"
   }

Это означает, что Вы не можете делать QUIT в конце каждого из множества операторов IF:

If (p) Do

. If x Set t=1 QUIT

. If y Set t=3

Но теперь у Вас есть настоящий ELSE, так что потеря не слишком велика:

If (p) {
  If(x) { Set t = 1 }
  ElseIf (y) { Set t = 3 }
  }

Проблемы с использованием блоков в CDL, связанные с обрамлением начала и конца методов фигурными скобками { } решаются следующим образом:

Если строка начинается с } внутри метода в CDL, это вызовет ошибку при загрузке CDL:

 // такой вариант не работает
 method Method() {
        public;
        code    = {
          If (a = 3) {
            Write "Hey"
          }
        }
 }

Предваряйте скобку } двоеточием (:) :

// делайте так
method Method() {
        public;
        code    = {
          If (a = 3) {
             Write "Hey"
          :}
        }
}

Обрамляйте код квадратными скобками [ ]

// так тоже работает
method Method() {
 public;
  code    = [
    If (a = 3) {
      Write "Hey"
    }
  ]
}

$SORTBEGIN / $SORTEND

$SortBegin( имя глобала [, размер буфера] )

$SortEnd( имя глобала )

indtest //Тест, использующий $SortBegin/$SortEnd для построения индекса (^PersonI)

 

 

start

       w !,"Начинаем..."

       k ^PersonI,^PersonD

       w !,$ZDT($H)

       s IO="c:/infile.txt"

       o IO:"R"

       u IO

       s x=$SORTBEGIN(^PersonI)

       f d=1:1 D SAVE

END

       s x=$SORTEND(^PersonI)

       c IO

       w !,$ZDT($H)

       W !,"Закончили..."

       q

SAVE

       s $ETRAP="goto OnError^indtest"

       R REC

       s ln=$piece(REC,",",1)

       s fn=$piece(REC,",",2)

       s id = $increment(^PersonD)

       s ^PersonD(id)=REC

       s ^PersonI=id

       s ^PersonI("Name",ln,fn,id) = ""

OnError

       s $ETRAP=""

       s zermes=$ZERROR

       s ermes=$p($p($ZERROR,">",1),"<",2)

       if ermes = "ENDOFFILE" goto END

Полученный в результате индекс ^PersonI:

^PersonI=519480
^PersonI("Name","001Adam","Frank",128872)=
^PersonI("Name","001Adams","Marianne",54946)=
^PersonI("Name","001Adams","nancy",259741)=
^PersonI("Name","001Addison","Angela",222778)=
^PersonI("Name","001Ahmed","Shuur",125875)=
^PersonI("Name","001Allen","Paul",369631)=
^PersonI("Name","001Allin","Mark",404596)=
^PersonI("Name","001Alton","Neil",206794)=
^PersonI("Name","001Anderson","Wil",496504)=
^PersonI("Name","001Aquino","Renato",197803)=
^PersonI("Name","001Arica-Cruz","Maria",260740)=

Несколько записей входного файла:

996Corman,Jed
997Corman,Jed
998Corman,Jed
999Corman,Jed
001Olsen,Cindy
002Olsen,Cindy
003Olsen,Cindy
004Olsen,Cindy
005Olsen,Cindy
006Olsen,Cindy

       /*

         Пример использования    команды GOTO      

       */

 

Start() PUBLIC

{

         Set $ZT="Trap"

         Set i=1

         Write i," - начальное значение",!

        

         Goto Internal

 

Inc     

         // Увеличим значение i

         Set i=$increment(i)

         Write "Увеличили значение до ",i,!

 

Internal

         Set a = i

         If a < 5

         {

           Write "Значение a=",a," < 5",!

           Goto Inc

         }

         Else

         {

           Write "Значение a=",a," >= 5",!

           Goto Outside

         }

 

Trap

         Write "Выход оказался неудачным",!

         Quit

}

 // Сюда из процедуры выходить можно только указав имя

 // программы, иначе будет ошибка

Outside

         Write "Вышли из процедуры",!

         Quit

Пример использования процедур

 ; Старый синтаксис

test

 set a=1,b=2

 set result =$$doit(a,b)

 w !,"test a= ",a

 w !,"test b= ",b

 quit

doit(a,x)

 new b

 set a=11,x=12,b=13

 set result=$$doit2(a,x)

 w !,"doit b=",b

 quit 15

doit2(a,x)

 w !,"doit2 a=",a

 w !,"doit2 b=",b

 w !,"doit2 x=",x

 set b=23

 q 25

// Новый синтаксис

test

 set a = 1, b=2

 set result =$$doit(a,b)

 w !,"test a= ",a

 w !,"test b= ",b

 quit

doit(a, x) [b] {

 set a=11,x=12,b=13

 set result=$$doit2(a,x)

 w !,"doit b=",b

 quit 15

 }

doit2(a,x) [b] {

 w !,"doit2 a=",a

 w !,"doit2 b=",b

 w !,"doit2 x=",x

 set b=23

 q 25

 }

 

Hosted by uCoz